#ifndef MAINWINDOW_H_
#define MAINWINDOW_H_

#include <QtGui/QFileDialog>
#include <QtGui/QErrorMessage>

#include "AbstractWindow.h"
#include "Parser.h"
#include "Hopfield.h"

class MainWindow : public AbstractWindow
{

    Q_OBJECT

public:

    /*-----------------------------------------------------------------------------
     *  Contrói uma nova janela, conectando as ações dos widgets
     *-----------------------------------------------------------------------------*/
    MainWindow();

public slots:

    /*-----------------------------------------------------------------------------
     *  TRAIN: Habilita ou desabilita os botões
     *-----------------------------------------------------------------------------*/
    void trainLoadButtonClick();

    /*-----------------------------------------------------------------------------
     *  TRAIN: Ação ao clicar no botão 'Load'
     *-----------------------------------------------------------------------------*/
    void trainClearButtonClick();

    /*-----------------------------------------------------------------------------
     *  TRAIN: Ação ao clicar no botão 'Clear'
     *-----------------------------------------------------------------------------*/
    void trainNextButtonClick();

    /*-----------------------------------------------------------------------------
     *  TRAIN: Ação ao clicar no botão '>>'
     *-----------------------------------------------------------------------------*/
    void trainPrevButtonClick();

    /*-----------------------------------------------------------------------------
     *  TRAIN: Ação ao clicar no botão '<<'
     *-----------------------------------------------------------------------------*/
    void trainButtonClick();

    /*-----------------------------------------------------------------------------
     *  TRAIN: Ação ao clicar no botão 'Train'
     *-----------------------------------------------------------------------------*/
    void trainPatternItemChange();

    /*-----------------------------------------------------------------------------
     *  TRAIN: Ação quando muda a seleção da lista de padrões
     *-----------------------------------------------------------------------------*/
    void trainFileSelected(const QString& file);

    /*-----------------------------------------------------------------------------
     *  TEST: Ação ao clicar no botão 'Load'
     *-----------------------------------------------------------------------------*/
    void testLoadButtonClick();

    /*-----------------------------------------------------------------------------
     *  TEST: Ação ao clicar no botão 'Clear'
     *-----------------------------------------------------------------------------*/
    void testClearButtonClick();

    /*-----------------------------------------------------------------------------
     *  TEST: Ação ao clicar no botão '>>'
     *-----------------------------------------------------------------------------*/
    void testNextButtonClick();

    /*-----------------------------------------------------------------------------
     *  TEST: Ação ao clicar no botão '<<'
     *-----------------------------------------------------------------------------*/
    void testPrevButtonClick();

    /*-----------------------------------------------------------------------------
     *  TEST: Ação ao clicar no botão 'Test'
     *-----------------------------------------------------------------------------*/
    void testButtonClick();

    /*-----------------------------------------------------------------------------
     *  TRAIN: Ação quando muda a seleção da lista de padrões
     *-----------------------------------------------------------------------------*/
    void testPatternItemChange();

    /*-----------------------------------------------------------------------------
     *  TEST: Ação quando muda a seleção da lista de padrões
     *-----------------------------------------------------------------------------*/
    void testFileSelected(const QString& file);

private:

    /*-----------------------------------------------------------------------------
     *  Carrega uma memória
     *-----------------------------------------------------------------------------*/
    bool loadMemory(const QString& file, MemoryPtr& memory, QListWidget *patternList);

    /*-----------------------------------------------------------------------------
     *  Desenha um padrão
     *-----------------------------------------------------------------------------*/
    void drawPattern(MemoryPtr& memory, QListWidget *patternList, PatternView *patternView);

    /*-----------------------------------------------------------------------------
     *  Desenha um padrão
     *-----------------------------------------------------------------------------*/
    void drawPattern(PatternPtr& memory, PatternView *patternView);
    
    /*-----------------------------------------------------------------------------
     *  Vai para o próximo padrão
     *-----------------------------------------------------------------------------*/
    void nextPattern(QListWidget *patternList);

    /*-----------------------------------------------------------------------------
     *  Vai para o padrão anterior
     *-----------------------------------------------------------------------------*/
    void prevPattern(QListWidget *patternList);

    /*-----------------------------------------------------------------------------
     *  Treina a rede Hopfield
     *-----------------------------------------------------------------------------*/
    void trainHopfield();

    /*-----------------------------------------------------------------------------
     *  Testa a rede Hopfield
     *-----------------------------------------------------------------------------*/
    void testHopfield();

    /*-----------------------------------------------------------------------------
     *  Memória de treinamento
     *-----------------------------------------------------------------------------*/
    MemoryPtr trainMemory;

    /*-----------------------------------------------------------------------------
     *  Memória de teste
     *-----------------------------------------------------------------------------*/
    MemoryPtr testMemory;

    /*-----------------------------------------------------------------------------
     *  Rede Hopfield
     *-----------------------------------------------------------------------------*/
    HopfieldPtr hopfield;

    /*-----------------------------------------------------------------------------
     *  Verdadeiro se a rede está treinada
     *-----------------------------------------------------------------------------*/
    bool isTrained;

    /*-----------------------------------------------------------------------------
     *  Verdadeiro se carregou a memória de teste
     *-----------------------------------------------------------------------------*/
    bool isLoaded;

};

#endif
